#include <stdio.h>
#include <pthread.h>
#include <unistd.h>


/*
 * 证线程退出时的状态
 */


/*
 线程与分离与结合：

在任何一个时间点上，线程是可结合的（joinable）或者是分离的（detached）。一个可结合的线程能够被其他线程收回其资源和杀死。
在被其他线程回收之前，它的存储器资源（例如栈）是不释放的。相反，一个分离的线程是不能被其他线程回收或杀死的，
它的存储器资源在它终止时由系统自动释放。

创建出的线程默认属性为可结合，所以必须等待它否则会产生类似僵尸进程的情况。

若线程为可分离则不需要join，线程运行结束后会自动释放所有资源。

*/

void * thread_run1(void *arg)
{
       printf("thread_run1 : tid:%lu pid:%d \n",pthread_self(),getpid());
       return ((void*)1);
}
 
void * thread_run2(void *arg)
{
       printf("thread_run2 : tid:%lu pid:%d\n",pthread_self(),getpid());
       pthread_exit((void*)2);
       return ((void*)1);
}
 
void * thread_run3(void *arg)
{
       while(1)
       {
                printf("thread_run3 :tid:%lu pid:%d \n",pthread_self(),getpid());
                sleep(1);
       }
       return NULL;
}
int main()
{
       pthread_t id;
       void *temp;
       //正常退出时候查看他的id以及返回值
        pthread_create(&id,NULL,thread_run1,NULL);
       pthread_join(id,&temp);
       printf("thread_run1 return:id %u return code%d\n",id,(int)temp);
 
       //当中间调用线程终止的时候
       pthread_create(&id,NULL,thread_run2,NULL);
       pthread_join(id,&temp);
       printf("thread_run2 return:id %u return code%d\n",id,(int)temp);
 
       //当线程死循环时用函数取消线程的时候
       pthread_create(&id,NULL,thread_run3,NULL);
       sleep(1);
       pthread_cancel(id);
       pthread_join(id,&temp);
       printf("thread_run3 return:id %u return code%d\n",id,(int)temp);
 
       printf("the main tid is %u pid %d\n",pthread_self(),getpid());
       return 0;
}






